const path = require('path') // nodejs核心模块，专门用来处理路径问题
const ESLintWebpackPlugin = require("eslint-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  // 入口
  entry: './src/main.js', // 相对路径[相对指的是运行代码路径相对]
  // 输出
  output: {
    // 输出路径
    path: undefined, // 绝对路径, __dirname nodejs的变量，代表当前文件的文件夹目录[开发模式没有输出]
    // 入口文件打包输出文件名
    filename: 'js/main.js',
    // 自动清空上次打包结果
    // 原理：在打包前，将path中配置的地址【本项目中指dist】整个目录清空，再进行打包
    clean: true
  },
  // 加载器
  module: {
    rules: [
      {
        // 每个文件只能被其中一个loader配置处理
        oneOf: [
          // loader的配置
          {
            test: /\.css$/, // 只检测.css文件
            // loader: 'xxx', // loader只能使用一个loader，use可以使用多个loader
            use: [ // 执行顺序：从右到左（从下至上）
              'style-loader', // 将js中css通过创建style标签添加html文件中生效
              'css-loader', // 将css资源编译成commonjs的模块到js中
            ]
          },
          {
            test: /\.less$/, // 只检测.less文件
            use: [ // 执行顺序：从右到左（从下至上）
              'style-loader', // 将js中css通过创建style标签添加html文件中生效
              'css-loader', // 将css资源编译成commonjs的模块到js中
              'less-loader' // 将less编译为css文件
            ]
          },
          //#region 
          // {
          //     test: /\.s[ac]ss$/, // 只检测.sass/.scss文件
          //     use: [ // 执行顺序：从右到左（从下至上）
          //         'style-loader', // 将js中css通过创建style标签添加html文件中生效
          //         'css-loader', // 将css资源编译成commonjs的模块到js中
          //         'sass-loader' // 将sass编译为css文件
          //     ]
          // },
          // {
          //     test: /\.styl$/, // 只检测.styl文件
          //     use: [ // 执行顺序：从右到左（从下至上）
          //         'style-loader', // 将js中css通过创建style标签添加html文件中生效
          //         'css-loader', // 将css资源编译成commonjs的模块到js中
          //         'stylus-loader' // 将stylus编译为css文件
          //     ]
          // },
          //#endregion
          {
            test: /\.(png|jpe?g|gif|webp|svg)$/, 
            type: 'asset', // 有可能会转成base64
            parser: { // 转base64条件配置
              dataUrlCondition: {
                // 小于10kb的图片转base64
                // 有点：减少请求数量，缺点：体积会更大
                maxSize: 10 * 1024, // 10kb
              }
            },
            generator: {
              // 输出图片名称
              // filename: 'static/images/[hash][ext][query]'
              filename: 'static/images/[hash:10][ext][query]'// [hash:10] 限制文件长度最多为十位，hash值取前十位
            }
          },
          {
            test: /\.(ttf|woff2?|mp3|mp4|avi)$/, 
            type: 'asset/resource', // 不会转成base64
            generator: {
              // 输出名称
              filename: 'static/media/[hash:10][ext][query]'// [hash:10] 限制文件长度最多为十位，hash值取前十位
            }
          },
          {
            test: /\.js$/,
            exclude: /node_modules/, // 排除node_modules代码不编译
            // include: path.resolve(__dirname,'../src'), // 只处理src下的文件，其他文件不处理
            loader: "babel-loader",
            // options: { // 写在babel.config.js中
            //   presets: ['@babel/preset-env']
            // }
          },
        ]
      }
    ],
  },
  // 插件
  plugins: [
    new ESLintWebpackPlugin({
      // 指定检查文件的根目录
      context: path.resolve(__dirname, "../src"),
      exclude: 'node_modules' // 默认值
    }),
    new HtmlWebpackPlugin({
      // 以 public/index.html 为模板创建文件
      // 新的html文件有两个特点：1. 内容和源文件一致 2. 自动引入打包生成的js等资源
      template: path.resolve(__dirname, "../public/index.html"),
    }),
  ],
  // 开发服务器：不会输出资源，在内存中编译打包
  devServer: {
    host: "localhost", // 启动服务器域名
    port: "3000", // 启动服务器端口号
    open: true, // 是否自动打开浏览器
    hot: true, // 开启HMR功能（只能用于开发环境，生产环境不需要了）
  },
  // 模式
  mode: 'development',
  devtool: "cheap-module-source-map",
}